package com.example.filemanager;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.WebView.FindListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Manager {

	public static List<Map<String, Object>> getData(File file) { // 将目录数据填充到链表中
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		Map<String, Object> map = null;
		// File f = new File(mDir); // 打开当前目录
		File[] files = file.listFiles(); // 获取当前目录中文件列表

		// if (!mDir.equals("/sdcard")) { // 不充许进入/sdcard上层目录
		// map = new HashMap<String, Object>(); // 加返回上层目录项
		// map.put("title", "Back to ../");
		// map.put("info", f.getParent());
		// map.put("img", R.drawable.icon_file);
		// list.add(map);
		// }
		if (files != null) { // 将目录中文件填加到列表中
			for (int i = 0; i < files.length; i++) {
				map = new HashMap<String, Object>();
				map.put("filename", files[i].getName());
				map.put("filepath", files[i].getPath());
				// if (files[i].isDirectory()) // 按不同类型显示不同图标
				map.put("filetype", R.drawable.icon_file);
				// else
				// map.put("img", R.drawable.icon_file);
				list.add(map);
			}
		}
		return list;
	}

	/**
	 * 判断SD卡是否插入
	 */
	public static boolean SDcardExist() {
		return Environment.getExternalStorageState().equals(
				android.os.Environment.MEDIA_MOUNTED);
	}

	/**
	 * 获得sd卡根目录
	 */
	public static File getSDcardROOT() {
		File sdRoot = Environment.getExternalStorageDirectory();
		return sdRoot;
	}

	/**
	 * 获得私有根目录：
	 */
	public static String getFileRoot(Context context) {
		String fileRoot = context.getFilesDir() + "//";
		return fileRoot;
	}

	/**
	 * 检查重名
	 */
	public static boolean isRename(String name) {
		for (Map<String, Object> map : MainActivity.fileList) {
			if (name.equals(map.get("filename"))) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 认证是否根目录
	 * 
	 * @param path
	 * @return
	 */
	
	public static boolean isRootPath(String path) {
		File file = new File(path);
		String rootPath = getSDcardROOT().getPath();
		if (path.equals(rootPath)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 新建文件夹
	 */
	public static File makeNewDir(String filwPath) {
		File file = new File(filwPath);// +"/"+ fileName);
		file.mkdir();
		return file;
		// return FileManagerUtil.makeDir(file);
	}

	/**
	 * 删除文件夹
	 */
	public static boolean delFile(String filwPath, String fileName) {
		File file = new File(filwPath + "/" + fileName);
		return file.delete();
	}

	/**
	 * 重命名
	 */
	public static boolean doRename(String filePath, String oldfileName,
			String newFileName) {
		File oleFile = new File(filePath + "/" + oldfileName);
		File newFile = new File(filePath + "/" + newFileName);
		return oleFile.renameTo(newFile);
	}

	/**
	 * 复制文件
	 * 
	 * @param sourceFile
	 * @param targetFile
	 * @throws IOException
	 */
	public static boolean copyFile(File sourceFile, File targetFile)
			throws IOException {
		// 新建文件输入流并对它进行缓冲
		FileInputStream input = new FileInputStream(sourceFile);
		BufferedInputStream inBuff = new BufferedInputStream(input);

		// 新建文件输出流并对它进行缓冲
		FileOutputStream output = new FileOutputStream(targetFile);
		BufferedOutputStream outBuff = new BufferedOutputStream(output);

		// 缓冲数组
		byte[] b = new byte[1024 * 5];
		int len;
		while ((len = inBuff.read(b)) != -1) {
			outBuff.write(b, 0, len);
		}
		// 刷新此缓冲的输出流
		outBuff.flush();

		// 关闭流
		inBuff.close();
		outBuff.close();
		output.close();
		input.close();
		
		return true;
	}

	/**
	 * 复制文件夹
	 * 
	 * @param sourceDir
	 * @param targetDir
	 * @throws IOException
	 */
	public static boolean copyDirectiory(String sourceDir, String targetDir)
			throws IOException {
		// 新建目标目录
		(new File(targetDir)).mkdirs();
		// 获取源文件夹当前下的文件或目录
		File[] file = (new File(sourceDir)).listFiles();
		for (int i = 0; i < file.length; i++) {
			if (file[i].isFile()) {
				// 源文件
				File sourceFile = file[i];
				// 目标文件
				File targetFile = new File(
						new File(targetDir).getAbsolutePath() + File.separator
								+ file[i].getName());
				copyFile(sourceFile, targetFile);
			}
			if (file[i].isDirectory()) {
				// 准备复制的源文件夹
				String dir1 = sourceDir + "/" + file[i].getName();
				// 准备复制的目标文件夹
				String dir2 = targetDir + "/" + file[i].getName();
				copyDirectiory(dir1, dir2);
			}
		}
		return true;
	}

	/**
	 * 移动SD卡上的单个文件
	 * 
	 * @param srcFileName
	 * @param destFileName
	 * @return
	 * @throws IOException
	 */
	// public boolean moveSDFileTo(String srcFileName, String destFileName)
	// throws IOException {
	// File srcFile = new File(SDPATH + srcFileName);
	// File destFile = new File(SDPATH + destFileName);
	// return moveFileTo(srcFile, destFile);
	// }

	/**
	 * 移动SD卡上的指定目录的所有文件
	 * 
	 * @param srcDirName
	 * @param destDirName
	 * @return
	 * @throws IOException
	 */
	// public boolean moveSDFilesTo(String srcDirName, String destDirName)
	// throws IOException {
	// File srcDir = new File(SDPATH + srcDirName);
	// File destDir = new File(SDPATH + destDirName);
	// return moveFilesTo(srcDir, destDir);
	// }

	/**
	 * 属性
	 */
	public static Map<String, Object> checkProperty(File file) {
		long fileSize = file.length();
		String filePath = file.getPath();
		long modifyTime = file.lastModified();//最后修改时间
		boolean canRead = file.canRead();//是否可读
		boolean canWrite = file.canWrite();//是否可写
		boolean isHide = file.isHidden();//是否隐藏
		
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("fileSize", fileSize);
		map.put("filePath", filePath);
		
		map.put("modifyTime", modifyTime);
		map.put("canRead", canRead);
		map.put("canWrite", canWrite);
		map.put("isHide", isHide);
		return map;
	}
}
